package com.feng.study.util;

import com.feng.study.common.CodeEnum;
import org.apache.commons.lang.StringUtils;

import java.util.Objects;

/**
 * <p>
 * </p>
 *
 * @author luohancheng
 * @since 2020-06-28
 **/
public class EnumUtils {

    /**
     * @param code      数据库中的数字
     * @paaram enumClass 枚举类
     * @param <T>
     * @return 对应枚举的某个类别
     */
    public static <T extends CodeEnum> T getByCode(String code, Class<T> enumClass) {
        if (StringUtils.isEmpty(code)) {
            return null;
        }
        T[] enumConstants = enumClass.getEnumConstants();
        for (T each : enumClass.getEnumConstants()) {
            if (code.equals(each.getCode())) {
                return each;
            }
        }
        return null;
    }

    /**
     * @param code      数据库中的数字
     * @param enumClass 枚举类
     * @param <T>
     * @return 对应枚举的某个类别
     */
    public static <T extends CodeEnum> T getByCode(Integer code, Class<T> enumClass) {
        if (Objects.isNull(code)) {
            return null;
        }
        for (T each : enumClass.getEnumConstants()) {
            if (code.equals(each.getCode())) {
                return each;
            }
        }
        return null;
    }


    /**
     * @param code      数据库中的数字
     * @param enumClass 枚举类
     * @param <T>
     * @return 对应枚举的某个类别
     */
    public static <T extends CodeEnum> T getByCode(String code, Class<T> enumClass, T defaultV) {
        if (StringUtils.isEmpty(code)) {
            return defaultV;
        }
        for (T each : enumClass.getEnumConstants()) {
            if (code.equals(each.getCode())) {
                return each;
            }
        }
        return defaultV;
    }

    /**
     * @param code      数据库中的数字
     * @param enumClass 枚举类
     * @param <T>
     * @return 对应枚举的某个类别
     */
    public static <T extends CodeEnum> T getByCode(Integer code, Class<T> enumClass, T defaultV) {
        if (Objects.isNull(code)) {
            return defaultV;
        }
        for (T each : enumClass.getEnumConstants()) {
            if (code.equals(each.getCode())) {
                return each;
            }
        }
        return defaultV;
    }

    /**
     * @param code      数据库中的数字
     * @param enumClass 枚举类
     * @return 对应枚举的某个类别, 未匹配则抛异常
     */
    public static <T extends CodeEnum, C> T getEnumByCode(C code, Class<T> enumClass) throws Exception {
        if (Objects.isNull(code)) {
            throw new Exception("未找到枚举数据");
        }

        for (T each : enumClass.getEnumConstants()) {
            if (Objects.equals(code, each.getCode())) {
                return each;
            }
        }

        throw new Exception("未找到枚举数据");
    }


}
